﻿#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#pragma execution_character_set("utf-8")

#include <QMainWindow>
#include<QtSql/QSqlTableModel>
#include <vector>
#include<QKeyEvent>
#include<QLabel>
#include<QMenu>
#include"MyLineEdit.h"
#include<QStringList>
#include<QEvent>
#include<QCompleter>
using std::vector;

namespace Ui {
class MainWindow;
}

#include<string>
using std::string;
class MainWindow : public QMainWindow
{
    Q_OBJECT


    static  constexpr   int CLOSECONN = 0;
public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

protected:
    /**
     * @brief event 重写事件的关闭事件...判断是否真的需要关闭该软件
     *              如果用户选择是...关闭事件的数据库的链接
     *              如果用户选择否 忽略本次事件的执行
     *
     * @param event 事件参数
     */
    bool event(QEvent *event)override;

    /**
     * @brief keyPressEvent 处理键盘被按下的消息
     * @param event
     *  这里主要处理的是 键盘方向键的上下 和回车键
     */
    void keyPressEvent(QKeyEvent *event)override;
private slots:

    /**
     * @brief onBtnShow 按钮显示被按下
     */
    void onBtnShow();
    /**
     * @brief onBtnExecSql 执行sql 语句
     */
    void onBtnExecSql();

    /**
     * @brief onSqlTypeChange 数据库的类型被改变
     */
    void onSqlTypeChange();

    /**
     * @brief onBtnConnect 数据库链接
     */
    void onBtnConnect();
    /**
     * @brief onBtnDisConnect 断开链接
     */
    void onBtnDisConnect();

    /**
     * @brief onBtnModify 提交修改
     */
    void onBtnModify();

    /**
     * @brief onBtnUnModify 撤销修改
     */

    void onBtnUnModify();

    /**
     * @brief onBtnInput 增加一行
     */
    void onBtnInput();

    /**
     * @brief onBtnDeleteLine 删除一行
     */
    void onBtnDeleteLine();

    /**
     * @brief onTimerUp 更新时间
     */
    void onTimerUp();

    /**
     * @brief setStatusBar 重新设置状态栏
     * @param staLabel
     */
    void setStatusBar(QLabel *& staLabel);

    /**
     * @brief onTableNameChange
     * @param tableName
     */
    void onTableNameChange(QString tableName);

private:
    Ui::MainWindow *ui;
    QSqlTableModel * model;
    QSqlDatabase conn;
    QString mStrTableName;		//表名
    int iPreCount = 0 ;         //记录上一次的 👆 和 👇 的下标
    std::vector<QString> strCmd;		//之前输入过的命令
    QLabel *mStaLabel;
    /**
     * @brief setAttribute 设置布局控件的属性
     */
    void setAttribute();


    /**
     * @brief setConnect 链接处理函数
     */
    void setConnect();

    /**
     * @brief setCountPutStr  将sql 语句添加到 strCmd 和改变上一次的值
     * @param text  添加到 strCmd
     */
    void setCountPutStr(QString & text);

    /**
     * @brief initialAction
     * @param action
     * @param parent
     * @param text
     */
    void initialAction(QAction *& action, QObject * parent, QString text);
    /**
     * @brief initialMenu
     * @param menu
     * @param parent
     * @param title
     */
    void initialMenu(QMenu *& menu, QMenuBar * parent, QString title);
    /**
     * @brief initialMenuBar
     */
    void initialMenuBar();

    /**
     * @brief initialComPleter 初始化拼写
     * @param list
     * @return  QCompleter *
     */
    QCompleter * initialComPleter(QStringList &list,QObject* parent );

    QMenu * sqlMenu;            //sql 编辑框的menu
};

#endif // MAINWINDOW_H
